import pygame
from pygame.locals import *
from Metodos import *

imagensBomba_normal = ['imagens/bomb_moviments/normal_bomb/bomb_1.png', 'imagens/bomb_moviments/normal_bomb/bomb_1.png', 'imagens/bomb_moviments/normal_bomb/bomb_2.png', 'imagens/bomb_moviments/normal_bomb/bomb_2.png', 'imagens/bomb_moviments/normal_bomb/bomb_3.png', 'imagens/bomb_moviments/normal_bomb/bomb_3.png']
imagensBomba_relogio = ['imagens/bomb_moviments/bomba_relogio/bomba_relogio_1.png', 'imagens/bomb_moviments/bomba_relogio/bomba_relogio_1.png', 'imagens/bomb_moviments/bomba_relogio/bomba_relogio_2.png', 'imagens/bomb_moviments/bomba_relogio/bomba_relogio_2.png', 'imagens/bomb_moviments/bomba_relogio/bomba_relogio_3.png', 'imagens/bomb_moviments/bomba_relogio/bomba_relogio_3.png']

def arredonda_pos_bomba(coordenada):
    if coordenada % 30 <= 15:
        coordenada -= coordenada % 30
    else:
        coordenada += (30 - coordenada % 30)
    return coordenada

def explosao(bomba, lista_explosoes, potencia, paredeGrupo):
    for direcao in range(5):
        ordenada = bomba.rect.top
        abcissa = bomba.rect.left
        lista_auxiliar = []

        if direcao == 0:
            explosao = Explosao(abcissa, ordenada, 'imagens/bomba_explosao/fogo_centro.png')
            lista_explosoes.append(explosao)
        else:
            for p in range(potencia):
                if direcao == 1: # direita
                    abcissa += 30
                    lista_auxiliar.append(abcissa)
                elif direcao == 2: # esquerda
                    abcissa -= 30
                    lista_auxiliar.append(abcissa)
                elif direcao == 3: # cima
                    ordenada -= 30
                    lista_auxiliar.append(ordenada)
                elif direcao == 4: # baixo
                    ordenada += 30
                    lista_auxiliar.append(ordenada)
    
            lista_muros = []
            lista_paredes = []
            for parede in paredeGrupo:
                if direcao == 1 or direcao == 2:
                    if parede.rect.top == bomba.rect.top and parede.tipo == 'muro_destroi':
                        lista_muros.append(parede.rect.left)
                    elif parede.rect.top == bomba.rect.top and parede.tipo == 'parede':
                        lista_paredes.append(parede.rect.left)
                elif direcao == 3 or direcao == 4:
                    if parede.rect.left == bomba.rect.left and parede.tipo == 'muro_destroi':
                        lista_muros.append(parede.rect.top)
                    elif parede.rect.left == bomba.rect.left and parede.tipo == 'parede':
                        lista_paredes.append(parede.rect.top)

            primeira_colisao_muros = ''
            primeira_colisao_paredes = ''
            achou = False
            for elemento in lista_auxiliar:
                if not achou:
                    for muro in lista_muros:
                        if elemento == muro:
                            primeira_colisao_muros = elemento
                            achou = True
                    for parede in lista_paredes:
                        if elemento == parede:
                            primeira_colisao_paredes = elemento
                            achou = True
            
            lista_remocao = []
            for e in lista_auxiliar:
                if direcao == 1:
                    if primeira_colisao_muros != '': 
                        if achou and e > primeira_colisao_muros:
                            lista_remocao.append(e)
                    else:
                        if achou and e >= primeira_colisao_paredes:
                            lista_remocao.append(e)
                elif direcao == 2:
                    if primeira_colisao_muros != '':
                        if achou and e < primeira_colisao_muros:
                            lista_remocao.append(e)
                    else:
                        if achou and e <= primeira_colisao_paredes:
                            lista_remocao.append(e)
                elif direcao == 3:
                    if primeira_colisao_muros != '':
                        if achou and e < primeira_colisao_muros:
                            lista_remocao.append(e)
                    else:
                        if achou and e <= primeira_colisao_paredes:
                            lista_remocao.append(e)
                elif direcao == 4:
                    if primeira_colisao_muros != '':
                        if achou and e > primeira_colisao_muros:
                            lista_remocao.append(e)
                    else:
                        if achou and e >= primeira_colisao_paredes:
                            lista_remocao.append(e)

            for elemento in lista_remocao:
                lista_auxiliar.remove(elemento)

            for elemento in lista_auxiliar:
                if direcao == 1 or direcao == 2:
                    explosao = Explosao(elemento, bomba.rect.top, 'imagens/bomba_explosao/fogo_horizontal.png')
                    if len(lista_auxiliar) == potencia:
                        if elemento == lista_auxiliar[potencia - 1] and direcao == 1:
                            explosao = Explosao(elemento, bomba.rect.top, 'imagens/bomba_explosao/ponta_direita.png')
                        elif elemento == lista_auxiliar[potencia - 1] and direcao == 2:
                            explosao = Explosao(elemento, bomba.rect.top, 'imagens/bomba_explosao/ponta_esquerda.png')
                    lista_explosoes.append(explosao)                        
                elif direcao == 3 or direcao ==4:
                    explosao = Explosao(bomba.rect.left, elemento, 'imagens/bomba_explosao/fogo_vertical.png')
                    if len(lista_auxiliar) == potencia:
                        if elemento == lista_auxiliar[potencia - 1] and direcao == 3:
                            explosao = Explosao(bomba.rect.left, elemento, 'imagens/bomba_explosao/ponta_cima.png')
                        if elemento == lista_auxiliar[potencia - 1] and direcao == 4:
                            explosao = Explosao(bomba.rect.left, elemento, 'imagens/bomba_explosao/ponta_baixo.png')
                    lista_explosoes.append(explosao)
    
    bomba.grupo_explosao = pygame.sprite.RenderPlain(lista_explosoes)

class Bomba(pygame.sprite.Sprite):
    def __init__(self, boomColide, bombaGrupo, relogio):
        pygame.sprite.Sprite.__init__(self)
        self.image  = pygame.image.load('imagens/bomba.png')
        self.rect = pygame.Rect(boomColide.rect.left, boomColide.rect.top, 30, 30)
        self.rect.top = arredonda_pos_bomba(boomColide.rect.top)
        self.rect.left = arredonda_pos_bomba(boomColide.rect.left)
        self.potencia = boomColide.potencia_bomba
        if boomColide.bomba_relogio:
            self.tipo = 'bomba_relogio'
        else:
            self.tipo = 'normal'
        self.indice_imagem = 0
        self.time = relogio
        self.direcao_move = ''
        self.foi_chutada = False
        if boomColide.bomba_relogio:
            self.tipo = 'bomba_relogio'
        else:
            self.tipo = 'normal'
        self.explosao_autorizada = False
        self.deve_colidir = False
        self.grupo_explosao = pygame.sprite.RenderPlain()
        
        if not boomColide in pygame.sprite.groupcollide(boomColide.grupo, bombaGrupo, 0, 0):
            bombaGrupo.add(self)
            boomColide.num_bombas -= 1

    def move(self, direcao):
        if direcao == 'cima':
            self.rect.top -= 10
        if direcao == 'baixo':
            self.rect.top += 10
        if direcao == 'esquerda':
            self.rect.left -= 10
        if direcao == 'direita':
            self.rect.left += 10

    def explode(self, bomba, boomColide, paredeGrupo):
        lista_explosoes = []
        ordenada_bomba = bomba.rect.top
        abcissa_bomba = bomba.rect.left
        explosao(bomba, lista_explosoes, bomba.potencia, paredeGrupo)

class Explosao(pygame.sprite.Sprite):
    def __init__(self, x, y, imagem):
        pygame.sprite.Sprite.__init__(self)
        self.image  = pygame.image.load(imagem)
        self.rect = self.image.get_rect()
        self.rect.top = y
        self.rect.left = x
